#ifndef _VL_RTSP_TCP_SOCKET__H_
#define _VL_RTSP_TCP_SOCKET__H_

#include "defs.h"
#include "utils/buffer.h"



namespace VLRTSP {

/**
 * @Author: CimZzz
 * @Date: 2022-01-10 16:18:57
 * 
 * TCP Socket
 * 
 * @note 编译 tcpsocket_linux.cpp 兼容类 Linux 操作系统下的套接字
 */
class TCPSocket {

public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:47:47
	 * 
	 * 构造函数
	 * 包装 Socket Fd
	 * @param fd Socket Fd
	 * @param ip IP 地址
	 * @param port 端口号
	 */
	explicit TCPSocket(VL_SOCKET fd, std::string ip, uint16_t port);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:48:04
	 * 
	 * 析构函数
	 */
	~TCPSocket();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:21:42
	 * 
	 * 读取套接字中的字节
	 * @param buffer 接收读取的字节缓冲区
	 * @param size 指定读取的字节长度，0 表示读取任意长度
	 * @return 读取成功返回读取长度，-1 表示读取失败
	 */
	int64_t read(Buffer* buffer, uint32_t size = 0);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:46:19
	 * 
	 * 写字节缓冲区中的字节
	 * @param buffer 字节缓冲区
	 * @return 如果写入成功返回 true
	 */
	bool write(Buffer* buffer);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 19:29:13
	 * 
	 * 关闭 Socket
	 */
	void close();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-11 15:37:17
	 * 
	 * 获取 Socket Id
	 */
	VL_SOCKET getSocketId();

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-10 16:19:56
	 * 
	 * SocketFD 句柄
	 */
	VL_SOCKET fd;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 16:14:30
	 * 
	 * IP 地址
	 */
	std::string ip;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-01-14 16:14:49
	 * 
	 * 端口号
	 */
	uint32_t port;

	
};

}

#endif //_VL_RTSP_TCP_SOCKET__H_
